[IA64] support DOMID_XEN and DOMID_IO of foreign domain page mapping
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 24 May 2006 16:39:55 +0000 (10:39 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Wed, 24 May 2006 16:39:55 +0000 (10:39 -0600)
support of foreign domain page mapping of DOMID_XEN and DOMID_IO.
This patch is needed for xentrace and xenmon.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/xen/domain.c
xen/arch/ia64/xen/xensetup.c
xen/include/asm-ia64/domain.h
xen/include/asm-ia64/mm.h

index dd241f6db83449ab2ac456a4b25a4295c3efb14b..bff2e85500570a89062238fc05bfa5f92bd1733b 100644 (file)
@@ -80,6 +80,41 @@ void build_physmap_table(struct domain *d);
 static void try_to_clear_PGC_allocate(struct domain* d,
                                       struct page_info* page);
 
+#ifdef CONFIG_XEN_IA64_DOM0_VP
+static struct domain *dom_xen, *dom_io;
+
+// followings are stolen from arch_init_memory() @ xen/arch/x86/mm.c
+void
+alloc_dom_xen_and_dom_io(void)
+{
+    /*
+     * Initialise our DOMID_XEN domain.
+     * Any Xen-heap pages that we will allow to be mapped will have
+     * their domain field set to dom_xen.
+     */
+    dom_xen = alloc_domain();
+    BUG_ON(dom_xen == NULL);
+    spin_lock_init(&dom_xen->page_alloc_lock);
+    INIT_LIST_HEAD(&dom_xen->page_list);
+    INIT_LIST_HEAD(&dom_xen->xenpage_list);
+    atomic_set(&dom_xen->refcnt, 1);
+    dom_xen->domain_id = DOMID_XEN;
+
+    /*
+     * Initialise our DOMID_IO domain.
+     * This domain owns I/O pages that are within the range of the page_info
+     * array. Mappings occur at the priv of the caller.
+     */
+    dom_io = alloc_domain();
+    BUG_ON(dom_io == NULL);
+    spin_lock_init(&dom_io->page_alloc_lock);
+    INIT_LIST_HEAD(&dom_io->page_list);
+    INIT_LIST_HEAD(&dom_io->xenpage_list);
+    atomic_set(&dom_io->refcnt, 1);
+    dom_io->domain_id = DOMID_IO;
+}
+#endif
+
 /* this belongs in include/asm, but there doesn't seem to be a suitable place */
 void arch_domain_destroy(struct domain *d)
 {
@@ -612,6 +647,12 @@ share_xen_page_with_guest(struct page_info *page,
     spin_unlock(&d->page_alloc_lock);
 }
 
+void
+share_xen_page_with_privileged_guests(struct page_info *page, int readonly)
+{
+    share_xen_page_with_guest(page, dom_xen, readonly);
+}
+
 //XXX !xxx_present() should be used instread of !xxx_none()?
 static pte_t*
 lookup_alloc_domain_pte(struct domain* d, unsigned long mpaddr)
@@ -1166,9 +1207,24 @@ dom0vp_add_physmap(struct domain* d, unsigned long gpfn, unsigned long mfn,
     struct domain* rd;
     rd = find_domain_by_id(domid);
     if (unlikely(rd == NULL)) {
-        error = -EINVAL;
-        goto out0;
+        switch (domid) {
+        case DOMID_XEN:
+            rd = dom_xen;
+            break;
+        case DOMID_IO:
+            rd = dom_io;
+            break;
+        default:
+            DPRINTK("d 0x%p domid %d "
+                    "pgfn 0x%lx mfn 0x%lx flags 0x%lx domid %d\n",
+                    d, d->domain_id, gpfn, mfn, flags, domid);
+            error = -ESRCH;
+            goto out0;
+        }
+        BUG_ON(rd == NULL);
+        get_knownalive_domain(rd);
     }
+
     if (unlikely(rd == d)) {
         error = -EINVAL;
         goto out1;
index 01c4de34614b85b39aab1dc4676cda84a1e71419..055c01cd5af301f5f161e8fc27b89dd6359923bd 100644 (file)
@@ -337,6 +337,7 @@ printk("About to call scheduler_init()\n");
     BUG_ON(idle_domain == NULL);
 
     late_setup_arch((char **) &cmdline);
+    alloc_dom_xen_and_dom_io();
     setup_per_cpu_areas();
     mem_init();
 
index c9e888378c7766200ad4022be26dce756c4a26ed..31ec0b9d87111aee026c6e7c7e0e431755dd3a13 100644 (file)
@@ -118,11 +118,14 @@ void __assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long
 void assign_domain_page(struct domain *d, unsigned long mpaddr, unsigned long physaddr);
 void assign_domain_io_page(struct domain *d, unsigned long mpaddr, unsigned long flags);
 #ifdef CONFIG_XEN_IA64_DOM0_VP
+void alloc_dom_xen_and_dom_io(void);
 unsigned long assign_domain_mmio_page(struct domain *d, unsigned long mpaddr, unsigned long size);
 unsigned long assign_domain_mach_page(struct domain *d, unsigned long mpaddr, unsigned long size);
 unsigned long do_dom0vp_op(unsigned long cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3);
 unsigned long dom0vp_zap_physmap(struct domain *d, unsigned long gpfn, unsigned int extent_order);
 unsigned long dom0vp_add_physmap(struct domain* d, unsigned long gpfn, unsigned long mfn, unsigned int flags, domid_t domid);
+#else
+#define alloc_dom_xen_and_dom_io()      do { } while (0)
 #endif
 
 #include <asm/uaccess.h> /* for KERNEL_DS */
index af1ec3128fd0e817824379409727118af387386d..be6415209b1e94d6349fcb0875841733b2611b90 100644 (file)
@@ -132,7 +132,8 @@ static inline u32 pickle_domptr(struct domain *_d)
 #define XENSHARE_readonly 1
 void share_xen_page_with_guest(struct page_info *page,
                                struct domain *d, int readonly);
-#define share_xen_page_with_privileged_guests(p, r) do { } while (0)
+void share_xen_page_with_privileged_guests(struct page_info *page,
+                                           int readonly);
 
 extern struct page_info *frame_table;
 extern unsigned long frame_table_size;